package com.lnsoft.cac.server.handle.codec.frameMessage;


import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import lombok.Data;
import lombok.NonNull;

@Data
/**
 * 通信流量数据报-升级过程中报文
 * */
public class Upgrade_Proc_Msg {
    private byte[] File_Name;               //20byte        文件名，以‘\0’结尾ASCII字符串，占用20Byte
    private int File_Packet_No;             //2byte         总包数
    private int File_Subpacket_No;          //2byte         子包包号（从0开始的无符号整数）
    private byte[] Data;                    //n byte        数据区


    public ByteBuf toByteBuf() throws Exception {
        if (File_Name == null) {
            File_Name = new byte[20];
        }
        if (File_Name.length != 20) {
            throw new Exception("文件名 设置异常");
        }
        if (Data == null) {
            Data = new byte[0];
        }
        ByteBuf bf = Unpooled.buffer();
        bf.writeBytes(File_Name);
        bf.writeShortLE(File_Packet_No);
        bf.writeShortLE(File_Subpacket_No);
        bf.writeBytes(Data);
        return bf;
    }


    //  解析 [升级过程中报文] 帧报文内容区 到消息体中
    public static Upgrade_Proc_Msg decFrameBody(@NonNull byte[] frameBody) throws Exception {
        ByteBuf bf = Unpooled.wrappedBuffer(frameBody);
        Upgrade_Proc_Msg msg = new Upgrade_Proc_Msg();
        int len = frameBody.length;
        if (len == 0) {
            return null;
        }
        if (24 > len) {
            throw new Exception("frameBody 数据异常");
        }
        byte[] File_Name = new byte[20];
        bf.getBytes(0, File_Name, 0, 20);
        msg.setFile_Name(File_Name);
        msg.setFile_Packet_No(bf.getUnsignedShortLE(20));
        msg.setFile_Subpacket_No(bf.getUnsignedShortLE(22));
        byte[] Data = new byte[len - 24];
        bf.getBytes(24, Data, 0, len - 24);
        msg.setData(Data);
        return msg;
    }
}
